// https://www.cnblogs.com/xiaoyan2017/p/14403820.html

import {
	shell,
	BrowserWindow,
	ipcMain
} from 'electron'
import {
	join
} from 'path'
import {
	is
} from '@electron-toolkit/utils'
import icon from '../../resources/icon.png?asset'

export const windowsCfg = {
	id: '', //唯一id
	width: 1200, //宽度
	height: 850, //高度
	minWidth: '', //最小宽度
	minHeight: '', //最小高度
	route: '', // 页面路由URL '/manage?id=123'
	resizable: true, //是否支持调整窗口大小
	maximize: false, //是否最大化
	isMultiWindow: false, //是否支持多开窗口 (如果为false，当窗体存在，再次创建不会新建一个窗体 只focus显示即可，，如果为true，即使窗体存在，也可以新建一个)
	isMainWin: false, //是否主窗口(当为true时会替代当前主窗口)
	parentId: '', //父窗口id  创建父子窗口 -- 子窗口永远显示在父窗口顶部 【父窗口可以操作】
	modal: false, //模态窗口 -- 模态窗口是禁用父窗口的子窗口，创建模态窗口必须设置 parent 和 modal 选项 【父窗口不能操作】
}

export class Window {
	constructor() {
		this.main = null; //当前页
		this.group = {}; //窗口组
	}

	// 窗口配置
	winOpts(wh = []) {
		return {
			width: wh[0],
			height: wh[1],
			show: false,
			autoHideMenuBar: true,
			icon: icon,
			webPreferences: {
				preload: join(__dirname, '../preload/index.js'),
				sandbox: false,
				nodeIntegration: true,
				contextIsolation: false
			}
		}
	}

	// 创建窗口
	createWindows(options) {

		//默认参数，与接受参数合并
		let args = Object.assign({}, windowsCfg, options)

		// 判断窗口是否存在
		for (let i in this.group) {
			if (this.getWindow(Number(i)) && this.group[i].route === args.route && !this.group[i].isMultiWindow) {
				this.getWindow(Number(i)).focus()
				return
			}
		}

		// 创建窗口参数
		let opt = this.winOpts([args.width, args.height])

		//创建子窗口
		if (args.parentId) {
			//主窗口的子窗口
			if (args.parentId == 'main') {
				args.parent = this.main
			} else {
				//其他窗口的子窗口
				for (let i in this.group) {
					if (this.group[i].id === args.parentId) {
						args.parent = this.getWindow(Number(i))
					}
				}
			}
			console.log('parent')
		} else if (this.main) {
			console.log('main')
		}

		// console.log('win-datalist', this.group)

		// 合并参数，并创建窗口
		let win = new BrowserWindow({
			...opt,
			...args
		})
		// console.log('win-data：', {
		// 	...opt,
		// 	...args
		// })

		//存窗口
		this.group[win.id] = {
			id: args.id, //窗口id
			parent: args.parent ? args.parentId : null, //父窗口id
			route: args.route,
			isMultiWindow: args.isMultiWindow
		}

		// 是否最大化
		if (args.maximize && args.resizable) {
			win.maximize()
		}
		// 是否主窗口
		if (args.isMainWin) {
			if (this.main) {
				delete this.group[this.main.id]
				this.main.close()
			}
			this.main = win
		}


		win.on('close', () => {
			win.setOpacity(0)
			for (let i in this.group) {
				if (this.group[i].parent == this.group[win.id].id) {
					delete this.group[i]
				}
			}
			delete this.group[win.id]
			// console.log(this.group)
		})
		
		// 窗口拖拽
		win.on('will-resize', (event) => {
			event.preventDefault()
		})

		win.on('ready-to-show', () => {
			win.show()
		})

		win.webContents.setWindowOpenHandler((details) => {
			shell.openExternal(details.url)
			return {
				action: 'deny'
			}
		})

		if (args.route.includes('http')) {
			win.loadURL(args.route)
		} else {
			if (is.dev && process.env['ELECTRON_RENDERER_URL']) {
				win.loadURL(process.env['ELECTRON_RENDERER_URL'] + '/#/' + args.route)
			} else {
				win.loadURL(join(__dirname, '../renderer/index.html') + '#/' + args.route)
			}
		}
		// 控制台
		// win.webContents.openDevTools()

	}

	// 获取窗口
	getWindow(id) {
		return BrowserWindow.fromId(id)
	}

	// 开启监听
	listen() {
		// 创建窗口
		ipcMain.on('window-new', (event, args) => this.createWindows(args))
	}
}